package org.basis.nio.c2;

import lombok.extern.slf4j.Slf4j;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * channel测试
 *
 * @author Mr_wenpan@163.com 2021/09/14 10:58
 */
@Slf4j
public class ChannelDemo1 {

    public static void main(String[] args) {
        // 通过RandomAccessFile来访问文件（可读可写）
        try(RandomAccessFile file = new RandomAccessFile("basis-netty-practice/data.txt","rw")) {
            // 通过RandomAccessFile获取到文件channel
            FileChannel channel = file.getChannel();
            // 分配十个字节大小的内存(创建出来的buffer默认为写模式)
            ByteBuffer buffer = ByteBuffer.allocate(10);

            do {
                // 从文件channel中读取到buffer中
                int len = channel.read(buffer);
                log.info("读取到的字节数：{}",len);
                // channel中的数据读取完毕了就会返回-1
                if(len == -1){
                    break;
                }
                // 切换到buffer的读模式
                buffer.flip();
                // 这里测试一个字节一个字节的读取
                while (buffer.hasRemaining()){
                    log.info("{}",(char)buffer.get());
                }
                // 切换buffer到写模式(有两种方式切换，一种是clear另一种是compact)
                buffer.clear();
            }while (true);

        }catch (Exception ex){
            ex.printStackTrace();
        }
    }

}
